articles

home / developersection / articles / form validation and request submission in angular js

Form validation and request submission in angular js

Form validation and request submission in angular js

Anubhav Kumar 280 16-May-2024

Forms and validation are crucial aspects of any web application, and AngularJS provides robust support for handling both. Here's a detailed guide on how to manage forms and validation in AngularJS.

I hope, You know about the HTML form and its uses. There are some changes in your code for angular js.

 

Create a form with validations –

1. Creating a Form AngularJS provides the ng-form directive to create forms. Here's a basic example:

<div class="container" ng-app="myApp" ng-controller="MySimpleController">
        <h2>AngularJS Form</h2>
        <hr>
        <!-- Create a form  -->
        <form name="userForm" class="row g-3" accept="" method="" novalidate>
            <!-- Create a field for name model -->
            <div class="col-12">
                <label class="form-label fw-bold">Name</label>
                <input type="text" ng-model="user.name" class="form-control" placeholder="Name"
                    autofocus="true" required />
            </div>
            <!-- Create a filed for email model -->
            <div class="col-12">
                <label class="form-label fw-bold">Email</label>
                <input type="email" ng-model="user.email" class="form-control" placeholder="Email"
                    autofocus="true" required />
            </div>
            <!-- Create a field for age model -->
            <div class="col-12">
                <label class="form-label fw-bold">Age</label>
                <input type="number" ng-model="user.age" class="form-control" placeholder="Age"
                    autofocus="true" required />
            </div>
            <!-- Create a field for about model -->
            <div class="col-12">
                <label class="form-label fw-bold">About</label>
                <textarea type="text" ng-model="user.about" class="form-control" placeholder="About"
                    autofocus="true" required></textarea>
            </div>
            <div class="col-12">
                <button class="btn btn-primary" ng-disabled="userForm.$invalid">Submit</button>
            <div>
        </form>
    </div>
    <script>
        var app = angular.module('myApp', []);
        app.controller('MySimpleController', function ($scope) {
            $scope.user = { name: '', email: '', age: null, about: '' };
        });
    </script>

 

2. Adding Validation AngularJS provides built-in validation directives that you can use directly on form elements:

  • required: Ensures the field is not empty.
  • ng-minlength and ng-maxlength: Specifies minimum and maximum length for input.
  • ng-pattern: Validates the input based on a regular expression.
  • type="email": Checks if the input is a valid email.
  • type="number": Ensures the input is a number.

 

Here’s an extended version of the previous example with additional validations:
    <div class="container" ng-app="myApp" ng-controller="MySimpleController">
        <h2>AngularJS Form</h2>
        <hr>
        <!-- Create a form  -->
        <form name="userForm" class="row g-3" accept="" method="" novalidate>
            <!-- Create a field for name model -->
            <div class="col-12">
                <label class="form-label fw-bold">Name</label>
                <input type="text" id="name" name="name" ng-model="user.name" ng-minlength="3" ng-maxlength="20"
                    class="form-control" placeholder="Name" autofocus="true" required />
                <p class="text-danger">
                    <span ng-show="userForm.name.$error.required && userForm.name.$touched">Name is required.</span>
                    <span ng-show="userForm.name.$error.minlength">Name is too short.</span>
                    <span ng-show="userForm.name.$error.maxlength">Name is too long.</span>
                </p>
            </div>
            <!-- Create a filed for email model -->
            <div class="col-12">
                <label class="form-label fw-bold">Email</label>
                <input type="email" ng-model="user.email" class="form-control" placeholder="Email" autofocus="true"
                    required />
                <p class="text-danger">
                    <span ng-show="userForm.email.$error.required && userForm.email.$touched">Email is required.</span>
                    <span ng-show="userForm.email.$error.email">Invalid email address.</span>
                </p>
            </div>
            <!-- Create a field for age model -->
            <div class="col-12">
                <label class="form-label fw-bold">Age</label>
                <input type="number" id="age" name="age" ng-model="user.age" min="0" max="120" class="form-control"
                    placeholder="Age" autofocus="true" required />
                <p class="text-danger">
                    <span ng-show="userForm.age.$error.required && userForm.age.$touched">Age is required.</span>
                    <span ng-show="userForm.age.$error.min">Age must be at least 0.</span>
                    <span ng-show="userForm.age.$error.max">Age must be at most 120.</span>
                </p>
            </div>
            <!-- Create a field for about model -->
            <div class="col-12">
                <label class="form-label fw-bold">About</label>
                <textarea type="text" id="about" name="about" ng-model="user.about" class="form-control"
                    placeholder="About" autofocus="true" required></textarea>
                <p class="text-danger">
                    <span ng-show="userForm.about.$error.required && userForm.about.$touched">About is required.</span>
                </p>
            </div>

            <div class="col-12">
                <button class="btn btn-primary" ng-disabled="userForm.$invalid">Submit</button>
                <div>
        </form>
    </div>

 

3. Form State and Validation Classes

AngularJS provides several CSS classes that indicate the state of the form and its fields:

 

  • ng-valid / ng-invalid: The field is valid/invalid.
  • ng-pristine / ng-dirty: The field has not been modified/modified.
  • ng-touched / ng-untouched: The field has been blurred/never blurred.

You can use these classes to style the form elements based on their state.

<style>
    .ng-invalid.ng-touched {
        border-color: red;
    }
    .ng-valid.ng-touched {
        border-color: green;
    }
</style>

 

5. Handling Form Submission

When handling form submissions, you typically want to process the data only if the form is valid. You can do this by checking the $valid property of the form.

 

<div class="container" ng-app="myApp" ng-controller="MySimpleController">
        <h2>AngularJS Form</h2>
        <hr>
        <!-- Create a form  -->
        <form name="userForm" class="row g-3" accept="" method="" ng-submit="submitForm(userForm.$valid)" novalidate>
            <!-- Create a field for name model -->
            <div class="col-12">
                <label class="form-label fw-bold">Name</label>
                <input type="text" id="name" name="name" ng-model="user.name" ng-minlength="3" ng-maxlength="20"
                    class="form-control" placeholder="Name" autofocus="true" ng-pattern="/^[a-zA-Z0-9._-]+$/" required />
                <p class="text-danger">
                    <span ng-show="userForm.name.$error.required && userForm.name.$touched">Name is required.</span>
                    <span ng-show="userForm.name.$error.minlength">Name is too short.</span>
                    <span ng-show="userForm.name.$error.maxlength">Name is too long.</span>
                    <span ng-show="userForm.name.$error.pattern">Invalid name format.</span>
                </p>
            </div>
            <!-- Create a filed for email model -->
            <div class="col-12">
                <label class="form-label fw-bold">Email</label>
                <input type="email" ng-model="user.email" class="form-control" placeholder="Email" autofocus="true"
                    required />
                <p class="text-danger">
                    <span ng-show="userForm.email.$error.required && userForm.email.$touched">Email is required.</span>
                    <span ng-show="userForm.email.$error.email">Invalid email address.</span>
                </p>
            </div>
            <!-- Create a field for age model -->
            <div class="col-12">
                <label class="form-label fw-bold">Age</label>
                <input type="number" id="age" name="age" ng-model="user.age" min="0" max="120" class="form-control"
                    placeholder="Age" autofocus="true" required />
                <p class="text-danger">
                    <span ng-show="userForm.age.$error.required && userForm.age.$touched">Age is required.</span>
                    <span ng-show="userForm.age.$error.min">Age must be at least 0.</span>
                    <span ng-show="userForm.age.$error.max">Age must be at most 120.</span>
                </p>
            </div>
            <!-- Create a field for about model -->
            <div class="col-12">
                <label class="form-label fw-bold">About</label>
                <textarea type="text" id="about" name="about" ng-model="user.about" class="form-control"
                    placeholder="About" autofocus="true" required></textarea>
                <p class="text-danger">
                    <span ng-show="userForm.about.$error.required && userForm.about.$touched">About is required.</span>
                </p>
            </div>

            <div class="col-12">
                <button class="btn btn-primary" ng-disabled="userForm.$invalid">Submit</button>
                <div>
        </form>
    </div>
    <script>
        var app = angular.module('myApp', []);
        app.controller('MySimpleController', function ($scope) {
            $scope.user = { name: '', email: '', age: null, about: null };
            $scope.checkUsername = function (value) {
                // Custom validation logic
                if (value) {
                    var isValid = value.match(/^[a-zA-Z0-9._-]+$/);
                    return isValid ? true : false;
                }
                return false;
            };
            $scope.submitForm = function (isValid) {
                if (isValid) {
                    // Process form data
                    alert('Form is valid!');
                } else {
                    alert('Form is invalid!');
                }
            };
        });
    </script>

 

5. Now add all code in one project

<!doctype html>
<html lang="en" data-ng-app="myApp">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>AngularJS Todo List</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
    <!-- Angurr JS CDN  -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.8.3/angular.min.js"
        integrity="sha512-KZmyTq3PLx9EZl0RHShHQuXtrvdJ+m35tuOiwlcZfs/rE7NZv29ygNA8SFCkMXTnYZQK2OX0Gm2qKGfvWEtRXA=="
        crossorigin="anonymous" referrerpolicy="no-referrer">
        </script>

    <style>
        .ng-invalid.ng-touched {
            border-color: red;
        }

        .ng-valid.ng-touched {
            border-color: green;
        }
    </style>
</head>

<body>
    <div class="container" ng-controller="MySimpleController as sip">
        <h2>AngularJS Form</h2>
        <hr />
        <div>
            <!-- Create a form  -->
            <form name="userForm" class="row g-3" accept="" method="" ng-submit="submitForm(userForm.$valid)"
                novalidate>
                <!-- Hidden fields -->
                <input type="hidden" ng-model="userPost.id" />
                <!-- Create a field for userId model -->
                <div class="col-12">
                    <label class="form-label fw-bold">UserId</label>
                    <input type="number" id="userId" name="userId" ng-model="userPost.userId" class="form-control"
                        placeholder="userId" autofocus="true" required />
                    <p class="text-danger">
                        <span ng-show="userForm.userId.$error.required && userForm.userId.$touched">UserId is
                            required.</span>
                    </p>
                </div>
                <!-- Create a field for name model -->
                <div class="col-12">
                    <label class="form-label fw-bold">Title</label>
                    <input type="text" id="title" name="title" ng-model="userPost.title" ng-minlength="3"
                        ng-maxlength="100" class="form-control" placeholder="Title" autofocus="true"
                        ng-pattern="/^[a-zA-Z0-9._-\s]+$/" required />
                    <p class="text-danger">
                        <span ng-show="userForm.title.$error.required && userForm.title.$touched">Title is
                            required.</span>
                        <span ng-show="userForm.title.$error.minlength">Title is too short.</span>
                        <span ng-show="userForm.title.$error.maxlength">Title is too long.</span>
                        <span ng-show="userForm.title.$error.pattern">Invalid title format.</span>
                    </p>
                </div>
                <!-- Create a field for about model -->
                <div class="col-12">
                    <label class="form-label fw-bold">Body</label>
                    <textarea type="text" id="body" name="body" ng-model="userPost.body" class="form-control"
                        placeholder="Body" autofocus="true" required></textarea>
                    <p class="text-danger">
                        <span ng-show="userForm.body.$error.required && userForm.body.$touched">Body is required.</span>
                    </p>
                </div>

                <div class="col-12">
                    <div class="d-flex justify-content-between flex-column flex-md-row">
                        <div>
                            <button class="btn btn-secondary" type="button" data-ng-click="resetForm()">Reset</button>
                            <button class="btn btn-primary" type="submit"
                                ng-disabled="userForm.$invalid">Submit</button>
                        </div>
                        <div class="d-flex flex-column-reverse  flex-md-row align-items-center">
                            <p class="fw-bold px-2 m-0 my-1 my-md-0"
                                data-ng-bind="filteredPosts.length + ' record found'"></p>
                            <input type="search" data-ng-model="searchText" class="form-control mt-2 mt-md-0 w-auto"
                                placeholder="Search ..." />
                        </div>
                    </div>
                </div>
            </form>
        </div>
        <hr>
        <div class="row row-cols-1 row-cols-md-3 g-3 mb-3">
            <div class="w-100 py-3"
                data-ng-if="(filteredPosts = (Posts | orderBy:'id':true | customFilter:searchText )).length == 0">
                <div class="d-flex justify-content-center fw-bold">
                    <div class="text-center">
                        <p class=" fs-2 ">
                            <span class="me-2">😕</span>
                            No records were found
                        </p>
                        <p class="fw-normal">try somthing new keywords</p>
                    </div>
                </div>
            </div>
            <div class="col" data-ng-repeat="post in filteredPosts">
                <div class="card h-100">
                    <div class="card-header bg-transparent border-success position-relative">
                        <span class="px-2 position-absolute end-0 me-2 " data-post-id="{{post.id}}">
                            <button class="btn btn-link p-0" title="Edit" data-ng-click="editPost(post.id)"> <span
                                    class="bi bi-pencil me-1"></span></button>
                            <button class="btn btn-link p-0" title="Delete" data-ng-click="deletePost(post.id)"> <span
                                    class="bi bi-trash me-1 text-danger"></span></button>
                        </span>
                        <p class=" fw-bold m-0">
                            <span class="bi bi-person me-1"></span>
                            {{post.id}}
                        </p>
                    </div>
                    <div class="card-body">
                        <h5 class="card-title">
                            {{post.title}}
                        </h5>
                        <p class="mb-1">
                            {{post.body}}
                        </p>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script>
        var app = angular.module('myApp', []);
        // create custom search filter like type any keyword in search box and display in the ui format
        app.filter('customFilter', function () {
            return function (items, searchText) {
                if (!searchText) {
                    return items;
                }
                searchText = searchText.toLowerCase();
                return items.filter(function (item) {
                    return Object.keys(item).some(function (key) {
                        if (typeof item[key] === 'object') {
                            return Object.keys(item[key]).some(function (subKey) {
                                return String(item[key][subKey]).toLowerCase().includes(searchText);
                            });
                        }
                        return String(item[key]).toLowerCase().includes(searchText);
                    });
                });
            };
        });
        app.controller('MySimpleController', ['$scope', function ($scope) {
            $scope.Posts = [{
                "userId": 1,
                "id": 1,
                "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
            },
            {
                "userId": 1,
                "id": 2,
                "title": "qui est esse",
                "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
            },
            {
                "userId": 1,
                "id": 3,
                "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
                "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
            },
            {
                "userId": 1,
                "id": 4,
                "title": "eum et est occaecati",
                "body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit"
            },
            {
                "userId": 1,
                "id": 5,
                "title": "nesciunt quas odio",
                "body": "repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque"
            },
            {
                "userId": 1,
                "id": 6,
                "title": "dolorem eum magni eos aperiam quia",
                "body": "ut aspernatur corporis harum nihil quis provident sequi\nmollitia nobis aliquid molestiae\nperspiciatis et ea nemo ab reprehenderit accusantium quas\nvoluptate dolores velit et doloremque molestiae"
            },
            {
                "userId": 1,
                "id": 7,
                "title": "magnam facilis autem",
                "body": "dolore placeat quibusdam ea quo vitae\nmagni quis enim qui quis quo nemo aut saepe\nquidem repellat excepturi ut quia\nsunt ut sequi eos ea sed quas"
            },
            {
                "userId": 1,
                "id": 8,
                "title": "dolorem dolore est ipsam",
                "body": "dignissimos aperiam dolorem qui eum\nfacilis quibusdam animi sint suscipit qui sint possimus cum\nquaerat magni maiores excepturi\nipsam ut commodi dolor voluptatum modi aut vitae"
            },
            {
                "userId": 1,
                "id": 9,
                "title": "nesciunt iure omnis dolorem tempora et accusantium",
                "body": "consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas"
            },
            {
                "userId": 1,
                "id": 10,
                "title": "optio molestias id quia eum",
                "body": "quo et expedita modi cum officia vel magni\ndoloribus qui repudiandae\nvero nisi sit\nquos veniam quod sed accusamus veritatis error"
            }];
            $scope.userPostMaster = { title: '', userId: 10, id: 0, body: null };
            $scope.userPost = angular.copy($scope.userPostMaster);

            $scope.getPostById = function (postid) {
                const index = $scope.Posts.findIndex(p => p.id === postid);
                if (index !== -1) {
                    return $scope.Posts[index];
                }
            }

            $scope.getLastPost = function () {
                if (!$scope.Posts || $scope.Posts.length === 0) {
                    return null;
                }
                return $scope.Posts[$scope.Posts.length - 1];
            };


            // Function to submit the form
            $scope.submitForm = function (isValid) {
                if (isValid) {
                    if ($scope.userPost.id) {
                        // Find the index of the updated post
                        const index = $scope.Posts.findIndex(p => p.id === $scope.userPost.id);
                        if (index !== -1) {
                            // Update the post in the array
                            $scope.Posts[index] = angular.copy($scope.userPost);
                        }
                        alert('Post updated successfully!');
                    }
                    else {
                        // Handle the response after successful submission
                        if ($scope.getLastPost() != null) {
                            var newPost = angular.copy($scope.userPost);
                            //console.log(newPost, $scope.getLastPost());
                            newPost.id = $scope.getLastPost().id + 1;
                            $scope.Posts.push(newPost);
                        } else {
                            $scope.userPost.id = 1;
                            $scope.Posts.push($scope.userPost);
                        }
                        alert('Form submitted successfully!');
                    }
                    $scope.resetForm();
                } else {
                    alert('Form is invalid!');
                }
            };

            // Function to delete a post
            $scope.deletePost = function (postId) {
                if (window.confirm("Are you sure, You want to delete this record.")) {
                    // On successful deletion, remove the post from the scope
                    const index = $scope.Posts.findIndex(p => p.id === postId);
                    if (index !== -1) {
                        // Update the post in the array
                        $scope.Posts.splice(index, 1)
                    }
                    alert('Post deleted successfully!');
                }
            };

            // Function to fetch a post by ID for editing
            $scope.editPost = function (postId) {
                $scope.userPost = angular.copy($scope.getPostById(postId));
            };

            // Function to reset the form
            $scope.resetForm = function () {
                // Reset the post model
                $scope.userPost = angular.copy($scope.userPostMaster);
                // Reset form state
                $scope.userForm.$setPristine();
                $scope.userForm.$setUntouched();
            };
        }]);
    </script>
</body>

</html>

 

Output -

Form validation and request submission in angular js

Read also: https://www.mindstick.com/articles/335818/what-is-a-filter-and-how-to-use-it-in-angularjs-explain-with-an-example

Thank you.

 


The Anubhav portal was launched in March 2015 at the behest of the Hon'ble Prime Minister for retiring government officials to leave a record of their experiences while in Govt service .

Leave Comment

Comments

Liked By